package cn.tedu.charging.device.canal;

import cn.tedu.charging.device.pojo.po.StationCanalPO;
import cn.tedu.charging.device.service.DeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;


/**
 * 场站数据库 数据和Redis数据 同步处理器
 * 数据库表 charging_station 如果发生了变化 C create 创建 U update 更新 D delete 删除
 * 要通知 StationSyncHandler 处理器 @CanalTable("charging_station")
 *
 * charging_station 插入了数据 C 通知 StationSyncHandler#insert 方法  在Redis插入数据
 * charging_station 更新了数据 U 通知 StationSyncHandler#update 方法  在Redis更新数据
 * charging_station 删除了数据 D 通知 StationSyncHandler#delete 方法  在Redis删除数据
 *
 */
@Slf4j
@Component
@CanalTable("charging_station")
public class StationSyncHandler implements EntryHandler<StationCanalPO> {

    @Autowired
    private DeviceService deviceService;

    @Override
    public void insert(StationCanalPO stationCanalPO) {
        log.debug("数据表 charging_station 插入了新的数据：{}",stationCanalPO);

        //todo 自己查询对应的类型的插入API  String 插入 Hash插入
        //可以参考 缓存预热 预热就是保存 或者插入动作
        //put add set 常用的保存命令
        //数据不存在 保存 存在更新
        deviceService.insert(stationCanalPO);
        EntryHandler.super.insert(stationCanalPO);
    }

    @Override
    public void update(StationCanalPO before, StationCanalPO after) {
        log.debug("数据表 charging_station 更新之前：{}，更新之后：{}",before,after);
        //todo
        //String 通过set key 全量覆盖
        //String key:id value:StationPO set
        //Hash 共享 通过bigKey 和 HashKey 全量覆盖 value StationPO
        //Hash 共享 bigKey:stations HashKey:id value:StationPO
        //Hash 独享 通过bigKey 和 HashKey 全量覆盖 value 属性值
        //Hash 独享 bigKey : id HashKey: 属性名 value：属性值
        //全量覆盖 String StationPO 只更新了场站名称 全部更新
        //全量覆盖 String  Hash共享  StationPO 我只更新了场站名称 String的value是整个的StationPO要想更新必须 全部更新
        //局部更新 Hash独享  通过bigKey 和 HashKey 全量覆盖 value 属性名 更新指定的属性 而不用全量更新
        //HashOperations hashOperations = redisTemplate.opsForHash();
        //redisTemplate.opsForHash().put(
        //        "stations",stationCanalPO.getId(),"newValue");
        //购物车 increment 增加 1、减少 -1 指定bigkey和hashkey的值
        //hashOperations.increment("userId","商品id",-1);

        deviceService.update(after);

        EntryHandler.super.update(before,after);
    }

    @Override
    public void delete(StationCanalPO stationCanalPO) {
        log.debug("数据表 charging_station 删除了数据：{}",stationCanalPO);
        //todo 自己查询对应的类型的 删除 API  String 删除 Hash 删除
        //不区分数据类型的删除  redisTemplate.delete(key)
        //redisTemplate.delete("station_geo_" + stationCanalPO.getId());
        // 具体类型的删除 Hash  redisTemplate.opsForHash().delete()
        EntryHandler.super.delete(stationCanalPO);
    }
}
